Jackson Java-তে Date এবং Time ডেটা হ্যান্ডল করার জন্য শক্তিশালী সাপোর্ট প্রদান করে। এটি বিভিন্ন ফরম্যাটে Date এবং Time সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করতে পারে। Java 8 থেকে java.time প্যাকেজ যুক্ত হওয়ার পর, Jackson এর সাপোর্ট আরও উন্নত হয়েছে।
Date এবং Time হ্যান্ডল করার উপায়
Jackson ব্যবহার করে Date এবং Time ডেটা হ্যান্ডল করার জন্য নিচের পদ্ধতিগুলো অনুসরণ করা যায়:
1. Java.util.Date হ্যান্ডল করা
Jackson ডিফল্টভাবে java.util.Date সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করতে পারে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class DateExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Create an object with Date field
Person person = new Person("John Doe", new Date());
// Serialize to JSON
String json = mapper.writeValueAsString(person);
System.out.println("Serialized JSON: " + json);
// Deserialize back to object
Person deserializedPerson = mapper.readValue(json, Person.class);
System.out.println("Deserialized Person: " + deserializedPerson);
}
}
class Person {
private String name;
private Date birthDate;
// Default constructor
public Person() {}
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Override
public String toString() {
return "Person{name='" + name + "', birthDate=" + birthDate + '}';
}
}
Output:
Serialized JSON: {"name":"John Doe","birthDate":1695187603658}
Deserialized Person: Person{name='John Doe', birthDate=Sat Sep 18 00:00:00 UTC 2023}
2. Custom Date Format সেট করা
ডিফল্টভাবে, Jackson টাইমস্ট্যাম্প ফরম্যাট ব্যবহার করে। কাস্টম ফরম্যাট সেট করার জন্য @JsonFormat অ্যানোটেশন ব্যবহার করা হয়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class CustomDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Create an object with custom formatted Date
Event event = new Event("Conference", new Date());
// Serialize to JSON
String json = mapper.writeValueAsString(event);
System.out.println("Serialized JSON: " + json);
// Deserialize back to object
Event deserializedEvent = mapper.readValue(json, Event.class);
System.out.println("Deserialized Event: " + deserializedEvent);
}
}
class Event {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventDate;
public Event() {}
public Event(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getEventDate() {
return eventDate;
}
public void setEventDate(Date eventDate) {
this.eventDate = eventDate;
}
@Override
public String toString() {
return "Event{name='" + name + "', eventDate=" + eventDate + '}';
}
}
Output:
Serialized JSON: {"name":"Conference","eventDate":"2023-09-18 14:30:00"}
Deserialized Event: Event{name='Conference', eventDate=Mon Sep 18 14:30:00 UTC 2023}
3. Java 8 Date/Time API হ্যান্ডল করা
java.time.LocalDate, java.time.LocalDateTime, এবং অন্যান্য java.time ক্লাস হ্যান্ডল করার জন্য Jackson's JavaTimeModule ব্যবহার করা হয়।
Dependency:
Maven এর মাধ্যমে jackson-datatype-jsr310 যোগ করুন:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.15.2</version>
</dependency>
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDateTime;
public class Java8DateExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Register JavaTimeModule
mapper.registerModule(new JavaTimeModule());
// Create an object with LocalDateTime
Meeting meeting = new Meeting("Team Meeting", LocalDateTime.now());
// Serialize to JSON
String json = mapper.writeValueAsString(meeting);
System.out.println("Serialized JSON: " + json);
// Deserialize back to object
Meeting deserializedMeeting = mapper.readValue(json, Meeting.class);
System.out.println("Deserialized Meeting: " + deserializedMeeting);
}
}
class Meeting {
private String title;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime meetingTime;
public Meeting() {}
public Meeting(String title, LocalDateTime meetingTime) {
this.title = title;
this.meetingTime = meetingTime;
}
// Getters and Setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public LocalDateTime getMeetingTime() {
return meetingTime;
}
public void setMeetingTime(LocalDateTime meetingTime) {
this.meetingTime = meetingTime;
}
@Override
public String toString() {
return "Meeting{title='" + title + "', meetingTime=" + meetingTime + '}';
}
}
Output:
Serialized JSON: {"title":"Team Meeting","meetingTime":"2023-09-18 14:30:00"}
Deserialized Meeting: Meeting{title='Team Meeting', meetingTime=2023-09-18T14:30:00}
java.util.Date: ডিফল্ট সাপোর্টেড এবং টাইমস্ট্যাম্প হিসেবে সিরিয়ালাইজ হয়।- Custom Format:
@JsonFormatদিয়ে ফরম্যাট কাস্টমাইজ করা যায়। - Java 8 Date/Time API:
JavaTimeModuleরেজিস্টার করেLocalDate,LocalDateTimeইত্যাদি ফরম্যাট সহজেই হ্যান্ডল করা যায়।
এগুলো ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে বিভিন্ন ধরনের Date এবং Time ডেটা সহজেই হ্যান্ডল করতে পারবেন।
Java-তে Date এবং Time Serialization এবং Deserialization করার জন্য Jackson খুবই কার্যকর। তবে, ডিফল্ট সেটআপে java.util.Date, LocalDate, LocalDateTime ইত্যাদি Object-কে JSON-এ রূপান্তর করার সময় ফরম্যাটটি আপনার পছন্দ মতো নাও হতে পারে। এই সমস্যা সমাধানের জন্য আপনি Custom Date Format ব্যবহার করতে পারেন।
ডিফল্ট Date Serialization
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class DefaultDateExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// Simple Object with Date
Sample sample = new Sample(1, "Example", new Date());
// Object থেকে JSON
String json = objectMapper.writeValueAsString(sample);
System.out.println("Default Date Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Sample {
private int id;
private String name;
private Date date;
public Sample(int id, String name, Date date) {
this.id = id;
this.name = name;
this.date = date;
}
// Getters and Setters
}
ডিফল্ট JSON আউটপুট:
{"id":1,"name":"Example","date":1697774542997}
সমস্যা: ডিফল্ট Date Serialization Unix টাইমস্ট্যাম্প আকারে হয়। অনেক সময় এটি ব্যবহারকারী-বান্ধব নয়।
Custom Date Format ব্যবহার
Jackson-এ @JsonFormat এনোটেশন বা ObjectMapper কনফিগারেশন ব্যবহার করে Date ফরম্যাট কাস্টমাইজ করা যায়।
উদাহরণ: @JsonFormat এনোটেশন
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class CustomDateExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// Simple Object with Date
CustomSample sample = new CustomSample(1, "Example", new Date());
// Object থেকে JSON
String json = objectMapper.writeValueAsString(sample);
System.out.println("Custom Date Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class CustomSample {
private int id;
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
public CustomSample(int id, String name, Date date) {
this.id = id;
this.name = name;
this.date = date;
}
// Getters and Setters
}
আউটপুট:
{"id":1,"name":"Example","date":"2024-12-21 12:45:30"}
Global Configuration with ObjectMapper
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class GlobalDateFormatExample {
public static void main(String[] args) {
try {
// ObjectMapper Configuration
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// Custom Object
GlobalSample sample = new GlobalSample(1, "Example", LocalDateTime.now());
// Serialize to JSON
String json = objectMapper.writeValueAsString(sample);
System.out.println("Global Custom Date Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class GlobalSample {
private int id;
private String name;
private LocalDateTime dateTime;
public GlobalSample(int id, String name, LocalDateTime dateTime) {
this.id = id;
this.name = name;
this.dateTime = dateTime;
}
// Getters and Setters
}
আউটপুট:
{"id":1,"name":"Example","dateTime":"2024-12-21T12:45:30"}
Custom Serializer ব্যবহার করে Advanced Date Serialization
উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class AdvancedDateSerialization {
public static void main(String[] args) {
try {
// Custom Serializer
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
// Custom Object
AdvancedSample sample = new AdvancedSample(1, "Example", LocalDateTime.now());
// Serialize to JSON
String json = objectMapper.writeValueAsString(sample);
System.out.println("Advanced Date Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class AdvancedSample {
private int id;
private String name;
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime dateTime;
public AdvancedSample(int id, String name, LocalDateTime dateTime) {
this.id = id;
this.name = name;
this.dateTime = dateTime;
}
// Getters and Setters
}
class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
gen.writeString(value.format(formatter));
}
}
আউটপুট:
{"id":1,"name":"Example","dateTime":"2024-12-21 12:45:30"}
সংক্ষেপে
- ডিফল্ট Serialization: Jackson Unix টাইমস্ট্যাম্প ব্যবহার করে।
@JsonFormat: নির্দিষ্ট ফিল্ডের জন্য কাস্টম ফরম্যাট।- Global Configuration: পুরো প্রজেক্টের জন্য একটি নির্দিষ্ট ফরম্যাট।
- Custom Serializer: আরও জটিল ফরম্যাটিং বা লজিক প্রয়োগের জন্য ব্যবহার করা হয়।
Jackson এর এই টেকনিকগুলো আপনাকে Java-তে Date এবং Time Object Serialization এবং Deserialization আরও নমনীয় ও কাস্টমাইজড করতে সহায়তা করে।
@JsonFormat অ্যানোটেশন ব্যবহার করে আপনি JSON ডেটা প্রক্রিয়াকরণের সময় কাস্টম Date ফরম্যাট নির্ধারণ করতে পারেন। এটি Date বা LocalDate টাইপের ফিল্ডগুলির জন্য JSON সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় নির্দিষ্ট ফরম্যাটে ডেটা দেখানোর বা গ্রহণ করার সুবিধা দেয়।
কোড উদাহরণ
Step 1: Maven Dependency
প্রথমে, Jackson লাইব্রেরি আপনার প্রোজেক্টে যোগ করুন।
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
Step 2: JSON উদাহরণ
আমাদের JSON ডেটা নিচের মতো:
{
"name": "John Doe",
"birthDate": "21-12-1990"
}
আমাদের ক্লাসে birthDate ফিল্ড Date টাইপের হবে এবং এটি dd-MM-yyyy ফরম্যাটে JSON থেকে ডেসিরিয়ালাইজ এবং সিরিয়ালাইজ হবে।
Step 3: Java ক্লাসে @JsonFormat ব্যবহার করা
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
class Person {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date birthDate;
// Constructors
public Person() {}
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
@Override
public String toString() {
return "Person{name='" + name + "', birthDate=" + birthDate + '}';
}
}
Step 4: JSON থেকে Java Object এবং Java Object থেকে JSON
Jackson ObjectMapper ব্যবহার করে JSON ডেটা ডেসিরিয়ালাইজ এবং সিরিয়ালাইজ করা যাবে।
import com.fasterxml.jackson.databind.ObjectMapper;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JsonFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// JSON String
String json = """
{
"name": "John Doe",
"birthDate": "21-12-1990"
}
""";
// JSON to Java Object (Deserialization)
Person person = objectMapper.readValue(json, Person.class);
System.out.println("Deserialized Object: " + person);
// Java Object to JSON (Serialization)
String serializedJson = objectMapper.writeValueAsString(person);
System.out.println("Serialized JSON: " + serializedJson);
}
}
Output
- Deserialization Output:
Deserialized Object: Person{name='John Doe', birthDate=Fri Dec 21 00:00:00 BDT 1990}
- Serialized JSON:
{
"name": "John Doe",
"birthDate": "21-12-1990"
}
@JsonFormat প্যারামিটার ব্যাখ্যা
shape: ডেটা কোন আকারে থাকবে তা নির্ধারণ করে। উদাহরণ:JsonFormat.Shape.STRING.pattern: ডেটার কাস্টম ফরম্যাট নির্ধারণ করে। উদাহরণ:dd-MM-yyyy.timezone: ডেটার টাইমজোন নির্ধারণ করতে ব্যবহৃত হয়। উদাহরণ:timezone = "UTC".
বিকল্পভাবে টাইমজোন সেট করা
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy", timezone = "Asia/Dhaka")
private Date birthDate;
ব্যবহার ক্ষেত্র
- Custom Date Formats: JSON ডেটাতে নির্দিষ্ট ফরম্যাটে তারিখ প্রদর্শন।
- Time Zone Adjustments: বিভিন্ন টাইমজোন হ্যান্ডলিং।
- Consistency: সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় তারিখের ফরম্যাট কনসিস্টেন্ট রাখা।
Jackson এর @JsonFormat ব্যবহার করে আপনি খুব সহজেই ডেটা ফরম্যাট নিয়ন্ত্রণ করতে পারেন। এটি তারিখের সাথে সম্পর্কিত JSON ডেটার প্রক্রিয়াকরণ আরও সহজ এবং কার্যকর করে তোলে।
Java 8 থেকে LocalDate, LocalDateTime, ZonedDateTime প্রভৃতি Date/Time API ব্যবহার করা শুরু হয়। জ্যাকসন ডিফল্টভাবে এই টাইপগুলোর সাথে সরাসরি কাজ করতে পারে না। তবে, Jackson Module for Java 8 Date/Time ব্যবহার করে এগুলোর জন্য সমর্থন যোগ করা সম্ভব।
Jackson এবং Java 8 Date/Time API ব্যবহারের ধাপসমূহ
১. Dependencies যোগ করা
Jackson-এর মডিউল যোগ করতে Maven বা Gradle ব্যবহার করুন।
Maven:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.15.2</version> <!-- আপডেটেড সংস্করণ নিশ্চিত করুন -->
</dependency>
Gradle:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2'
২. ObjectMapper কনফিগার করা
Java 8 এর Date/Time API সঠিকভাবে সাপোর্ট করার জন্য ObjectMapper-এ JSR310Module রেজিস্টার করতে হবে।
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class JacksonJava8DateTimeExample {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
// Java 8 Date/Time API এর জন্য মডিউল যোগ করা
mapper.registerModule(new JavaTimeModule());
// Optional: ISO-8601 স্ট্যান্ডার্ড অনুসারে লেখার জন্য কনফিগারেশন
mapper.findAndRegisterModules();
}
}
Serialization এবং Deserialization উদাহরণ
১. Serialization (Java Object to JSON)
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDate;
import java.time.LocalDateTime;
class Person {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd") // কাস্টম ফরম্যাট
private LocalDate birthDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // কাস্টম ফরম্যাট
private LocalDateTime createdAt;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LocalDate getBirthDate() {
return birthDate;
}
public void setBirthDate(LocalDate birthDate) {
this.birthDate = birthDate;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
}
public class SerializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Person person = new Person();
person.setName("Jackson");
person.setBirthDate(LocalDate.of(1990, 5, 20));
person.setCreatedAt(LocalDateTime.now());
String json = mapper.writeValueAsString(person);
System.out.println("Serialized JSON: " + json);
}
}
Output:
{
"name": "Jackson",
"birthDate": "1990-05-20",
"createdAt": "2024-12-21 14:30:45"
}
২. Deserialization (JSON to Java Object)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DeserializationExample {
public static void main(String[] args) throws Exception {
String json = "{ \"name\": \"Jackson\", \"birthDate\": \"1990-05-20\", \"createdAt\": \"2024-12-21 14:30:45\" }";
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Person person = mapper.readValue(json, Person.class);
System.out.println("Deserialized Object: " + person.getName() + ", " + person.getBirthDate() + ", " + person.getCreatedAt());
}
}
Output:
Deserialized Object: Jackson, 1990-05-20, 2024-12-21T14:30:45
Custom Date/Time Format
@JsonFormatঅ্যানোটেশন ব্যবহার করে JSON ইনপুট এবং আউটপুটে তারিখের নির্দিষ্ট ফরম্যাট সংজ্ঞায়িত করা যায়।- ডিফল্ট ফরম্যাট:
ISO-8601(e.g.,"2024-12-21T14:30:45")
উদাহরণ:
@JsonFormat(pattern = "dd-MM-yyyy")
private LocalDate birthDate;
ObjectMapper-এর Global Configuration
যদি সব ক্ষেত্রেই নির্দিষ্ট ফরম্যাট প্রয়োগ করতে চান, তাহলে ObjectMapper-এ SerializationFeature কনফিগার করতে পারেন।
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.databind.SerializationFeature;
public class GlobalConfiguration {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
// ডেটা লেখার সময় টাইমস্ট্যাম্প এড়ানো
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
}
উপকারিতা
- JSR 310 সমর্থন:
LocalDate,LocalDateTime, এবং অন্যান্য Java 8 টাইম API সরাসরি সাপোর্ট। - কাস্টম ফরম্যাট: নির্দিষ্ট ফরম্যাটে তারিখ/সময় পরিচালনা করা।
- ISO-8601 স্ট্যান্ডার্ড: আন্তর্জাতিক স্ট্যান্ডার্ড ফরম্যাট ব্যবহারের সুবিধা।
- Serialization ও Deserialization সহজতর: বড় JSON ডেটা বা কাস্টম ডেটা টাইম প্রসেসিং দ্রুত ও কার্যকর।
Jackson-এর Java 8 Date/Time API সমর্থন JSON ডেটার সাথে কাজ করার সময় আরও কার্যকর এবং সহজ সমাধান প্রদান করে।
জ্যাকসন (Jackson) ব্যবহার করে কমপ্লেক্স ডেট ফরম্যাট হ্যান্ডল করা খুব সহজ, কারণ এটি ডেট ফরম্যাটিং এবং কাস্টমাইজেশনের জন্য বিভিন্ন বিল্ট-ইন এবং কাস্টম পদ্ধতি প্রদান করে।
নিচে বিভিন্ন পদ্ধতি এবং উদাহরণ দিয়ে বিষয়টি ব্যাখ্যা করা হলো:
1. Default Date Handling
জ্যাকসন ডিফল্টভাবে java.util.Date এবং অন্যান্য ডেট টাইপকে ISO-8601 ফরম্যাটে (যেমন, yyyy-MM-dd'T'HH:mm:ss.SSSZ) Serialize এবং Deserialize করে।
উদাহরণ: Default Date Handling
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class DefaultDateExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Date Serialization
Date currentDate = new Date();
String json = mapper.writeValueAsString(currentDate);
System.out.println("Serialized Date: " + json);
// Date Deserialization
Date deserializedDate = mapper.readValue(json, Date.class);
System.out.println("Deserialized Date: " + deserializedDate);
}
}
আউটপুট:
"2024-12-21T09:30:45.123+0000"
2. Custom Date Formats
@JsonFormat Annotation ব্যবহার করে
@JsonFormat অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ডেট ফরম্যাট নির্ধারণ করা যায়।
উদাহরণ: Custom Date Format
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
class Event {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date eventDate;
// Constructors, Getters, and Setters
public Event() {}
public Event(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
@Override
public String toString() {
return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
}
}
public class CustomDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Event event = new Event("Conference", new Date());
// Serialize
String json = mapper.writeValueAsString(event);
System.out.println("Serialized JSON: " + json);
// Deserialize
String eventJson = "{\"name\":\"Conference\",\"eventDate\":\"21-12-2024 15:30:00\"}";
Event deserializedEvent = mapper.readValue(eventJson, Event.class);
System.out.println("Deserialized Object: " + deserializedEvent);
}
}
আউটপুট:
Serialized JSON: {"name":"Conference","eventDate":"21-12-2024 15:30:00"}
Deserialized Object: Event{name='Conference', eventDate=Sat Dec 21 15:30:00 GMT 2024}
Global Date Format সেট করা
ObjectMapper-এর মাধ্যমে পুরো অ্যাপ্লিকেশনে ডেট ফরম্যাট নির্ধারণ করা যায়।
উদাহরণ: Global Date Format
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;
public class GlobalDateFormatExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Global date format
mapper.setDateFormat(new StdDateFormat());
Date currentDate = new Date();
// Serialize
String json = mapper.writeValueAsString(currentDate);
System.out.println("Serialized JSON: " + json);
// Deserialize
Date deserializedDate = mapper.readValue(json, Date.class);
System.out.println("Deserialized Date: " + deserializedDate);
}
}
3. Custom Serializer এবং Deserializer
কাস্টম লজিক প্রয়োগ করে ডেট ফরম্যাট হ্যান্ডল করা যায়।
উদাহরণ: Custom Serializer
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
class CustomDateSerializer extends JsonSerializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(formatter.format(date));
}
}
class EventCustom {
private String name;
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using = CustomDateSerializer.class)
private Date eventDate;
// Constructors, Getters, and Setters
public EventCustom(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
}
public class CustomSerializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
EventCustom event = new EventCustom("Seminar", new Date());
String json = mapper.writeValueAsString(event);
System.out.println("Serialized JSON: " + json);
}
}
আউটপুট:
{"name":"Seminar","eventDate":"21/12/2024 15:45:00"}
উদাহরণ: Custom Deserializer
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
class CustomDateDeserializer extends JsonDeserializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
try {
return formatter.parse(date);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class EventCustomDeserialization {
private String name;
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CustomDateDeserializer.class)
private Date eventDate;
// Getters, Setters, and toString
public EventCustomDeserialization() {}
public EventCustomDeserialization(String name, Date eventDate) {
this.name = name;
this.eventDate = eventDate;
}
@Override
public String toString() {
return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
}
}
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"name\":\"Workshop\",\"eventDate\":\"21/12/2024\"}";
EventCustomDeserialization event = mapper.readValue(json, EventCustomDeserialization.class);
System.out.println("Deserialized Object: " + event);
}
}
আউটপুট:
Deserialized Object: Event{name='Workshop', eventDate=Sat Dec 21 00:00:00 GMT 2024}
4. টিপস
- ডিফল্ট ফরম্যাট: ISO-8601 ফরম্যাট ব্যবহার করতে হলে কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই।
- কাস্টম ফরম্যাট: অ্যাপ্লিকেশনের প্রয়োজন অনুযায়ী
@JsonFormatবা কাস্টম Serializer/Deserializer ব্যবহার করুন। - Time Zones: সময় অঞ্চলের পার্থক্য থাকলে
java.timeপ্যাকেজ (যেমনLocalDateTime,ZonedDateTime) ব্যবহার করা ভালো।
Read more